package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.common.util.CondicionConsultaUtilVO;
import co.gov.medellin.ssti.sub.common.util.FiltrosReportesUtil;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AreaService;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.ProgramaService;
import co.gov.medellin.ssti.sub.model.service.RepBeneficioOtorgadoService;
import co.gov.medellin.ssti.sub.model.service.ReporteTotalBeneficiosOtorService;
import co.gov.medellin.ssti.sub.model.service.SedeService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetBeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalBeneficiosOtorVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.web.form.ReportTotalBOTForm;

@Component
public class ReportTotalBOTAction extends Action {
	private static final Logger logger = Logger
			.getLogger(ReportTotalComunaAction.class);

	/*
	 * Beans inyectados.
	 */
	@Autowired
	AreaService areaServiceImpl2;
	@Autowired
	AtributosService atributosServiceImpl2;
	@Autowired
	ProgramaService programaServiceImpl2;
	@Autowired
	ReporteTotalBeneficiosOtorService reporteTotalBeneficiosOtorServiceImpl;
	@Autowired
	RepBeneficioOtorgadoService repBeneficioOtorgadoServiceImpl2;
	@Autowired
	SedeService sedeServiceImpl2;
	@Autowired
	SubprogramaService subprogramaServiceImpl2;
	@Autowired
	FiltrosReportesUtil filtrosReportesUtil;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		HttpSession session = request.getSession();
		UserVO user = (UserVO) session.getAttribute("userInfo");

		session.removeAttribute("beneficiosReporteTotalBOT");
		session.removeAttribute("criteriaReporteTotalBOT");

		session.removeAttribute("msg");
		session.setAttribute("msg", "");
		Collection<AreaVO> areas = null;
		Collection<ProgramaVO> programas = null;
		Collection<SubprogramaVO> subprogramas = null;
		Collection<SedeVO> sedes = null;

		ReportTotalBOTForm formBean = (ReportTotalBOTForm) form;

		if ((Collection<CondicionConsultaVO>) session
				.getAttribute("filtrosReportTotalBOT") != null) {
			formBean.setFiltros((Collection<CondicionConsultaVO>) session
					.getAttribute("filtrosReportTotalBOT"));
		}

		// Object codePrograma = (Object) request.getParameter("codePrograma");

		try {
			sedes = sedeServiceImpl2.loadAllSedes();
			formBean.setSedes(sedes);
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}
		try {
			areas = areaServiceImpl2.findAreasAuthorized(
					String.valueOf(user.getCode()), user.getUserGroupName());
			formBean.setAreas(areas);
		} catch (DAOException e) {
			SUBException.logDebugError("", e);// TODO: handle exception
		}
		try {
			programas = repBeneficioOtorgadoServiceImpl2
					.findProgramaByUserReport(user.getCode(),
							user.getUserGroupName(), user.getCodeArea());
			if (programas != null && programas.size() > 0) {
				formBean.setProgramas(programas);
			} else {
				session.setAttribute("msg",
						"No se encontraron programas vigentes a la fecha..");
			}
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}
		// Si tiene un programa elegido, debe cargar los subprogramas
		// correspondientes.
		if (formBean.getCodePrograma() != null
				&& !formBean.getCodePrograma().equals("")) {
			try {
				// String strCodeProg = (String) codePrograma;
				SubprogramaVO vo = new SubprogramaVO();
				vo.setCodePrograma(new Long(formBean.getCodePrograma()));
				subprogramas = subprogramaServiceImpl2.findAllowedSubprograma(
						vo, user.getCode(), user.getUserGroupName(),
						user.getCodeArea());

			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}
			if (subprogramas.size() > 0) {
				formBean.setSubprogramas(subprogramas);
			} else {
				session.setAttribute("msg",
						"No se encontraron subprogramas asociados a este programa que esten vigentes..");
			}
		} else {
			if (formBean.getSubprogramas() != null) {
				formBean.getSubprogramas().clear();
			}
		}

		// Cambia de area.
		if (formBean.getOperacion().equals(Utility.OP_SELECT_AREA)) {
			ProgramaVO objProgramaVO = new ProgramaVO();
			objProgramaVO.setCodeArea(new Long(formBean.getCodeArea()));
			programas = programaServiceImpl2.findProgramaByCriteria(
					objProgramaVO, user.getUserGroupName(), user.getCode(),
					user.getCodeArea());
			formBean.setProgramas(programas);
		}

		// Cambia el programa.
		if (formBean.getOperacion().equals(Utility.OP_SELECT_PROGRAMA)) {
			if (!formBean.getCodePrograma().equals("")) {
				try {
					// String strCodeProg = (String) codePrograma;
					// subprogramas = repBeneficioOtorgadoServiceImpl2
					// .findSubProgramaByUserReport(user.getCode(),
					// user.getUserGroupName(),
					// formBean.getCodePrograma(),
					// user.getCodeArea());
					SubprogramaVO vo = new SubprogramaVO();
					vo.setCodePrograma(new Long(formBean.getCodePrograma()));
					subprogramas = subprogramaServiceImpl2
							.findAllowedSubprograma(vo, user.getCode(),
									user.getUserGroupName(), user.getCodeArea());
				} catch (DAOException e) {
					SUBException.logDebugError("", e);
				}
				session.removeAttribute("msg");
				if (subprogramas.size() > 0) {
					formBean.setSubprogramas(subprogramas);
				} else {
					session.setAttribute("msg",
							"No se encontraron subprogramas asociados a este programa que esten vigentes..");
				}
			} else {
				session.setAttribute("msg", "");
				// session.removeAttribute("subprogramas");
			}
		}

		// Cuando selecciona subprograma.
		if (formBean.getOperacion().equals("BuscarSiTieneAtributo")) {
			AtributoVO atributoVO = null;
			try {
				if (formBean.getCodeSubprograma() != null
						&& !formBean.getCodeSubprograma().equals("")) {
					atributoVO = new AtributoVO();
					atributoVO = atributosServiceImpl2
							.findAtributoEGSubprograma(Long.valueOf(formBean
									.getCodeSubprograma()));
				}
				if (atributoVO != null) {
					formBean.setGestores(atributoVO.getValoresflexibles());
				} else {
				}
			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}
		}

		// Filtros.
		// Operacion seleccionar un atributo (parametro)
		if (formBean.getOperacion()
				.equalsIgnoreCase(Utility.OP_SELECT_ATRIBUTO)
				|| !"".equals(formBean.getCodeAtributo())) {
			if (!formBean.getCodeAtributo().equals("")) {
				try {
					CondicionConsultaUtilVO condicionConsultaUtilVO = filtrosReportesUtil
							.obtainCondicionConsulta(formBean.getCodeAtributo());
					Collection<CondicionConsultaVO> operadores = condicionConsultaUtilVO
							.getOperadores();
					Collection<CondicionConsultaVO> valores1 = condicionConsultaUtilVO
							.getValores1();

					formBean.setOperadores(operadores);
					if (valores1 != null && !valores1.isEmpty()) {
						formBean.setValores1(valores1);
					} else {
						formBean.setValores1(null);
					}
					formBean.setValores2(null);
					formBean.setTipoCampo(condicionConsultaUtilVO
							.getTipoCampo());
					logger.info("tipocampo " + formBean.getTipoCampo());
				} catch (Exception e) {
					logger.error(e);
				}
			}
		}

		// Operacion agregar filtro
		if (formBean.getOperacion().equalsIgnoreCase(Utility.OP_ADD_FILTRO)) {
			CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
			condicionConsultaVO.setCodigo(formBean.getCodeAtributo());
			condicionConsultaVO.setCodcampo(formBean.getCodeAtributo());
			condicionConsultaVO.setCampo(formBean.getEtiquetaAtributo());
			condicionConsultaVO.setTipoCampo(formBean.getTipoCampo());
			condicionConsultaVO.setCodFiltro(formBean.getCodeOperador());
			condicionConsultaVO.setFiltro(formBean.getEtiquetaOperador());
			if (formBean.getEtiquetaValor1() != null
					&& !formBean.getEtiquetaValor1().equals("")) {
				condicionConsultaVO.setEtiquetaValor(formBean
						.getEtiquetaValor1());
				condicionConsultaVO.setValor(formBean.getValor1());
			} else {
				condicionConsultaVO.setEtiquetaValor(formBean.getValor1());
				condicionConsultaVO.setValor(formBean.getValor1());
			}

			condicionConsultaVO.setEtiquetaValor2(formBean.getValor2());
			condicionConsultaVO.setValor2(formBean.getValor2());
			// formBean.getFiltros().add(condicionConsultaVO);
			formBean.setCodeAtributo("");

			Collection<CondicionConsultaVO> filters = (Collection<CondicionConsultaVO>) session
					.getAttribute("filtrosReportTotalBOT");
			if (filters != null) {
				filters.add(condicionConsultaVO);
				formBean.setFiltros(filters);
			} else {
				Collection<CondicionConsultaVO> col = new ArrayList<CondicionConsultaVO>();
				col.add(condicionConsultaVO);
				session.setAttribute("filtrosReportTotalBOT", col);
				formBean.setFiltros(col);
			}
			formBean.setValor1("");
		}
		// operacion eliminar filtro
		if (formBean.getOperacion().equalsIgnoreCase(Utility.OP_DELETE_FILTRO)) {
			Collection<CondicionConsultaVO> filtros = formBean.getFiltros();

			int index = formBean.getIndexFilter();
			int count = 1;
			Iterator<CondicionConsultaVO> it = filtros.iterator();
			while (it.hasNext()) {
				it.next();
				if (index == count) {
					it.remove();
					break;
				} else {
					count++;
				}
			}
		}

		boolean continuar = true;

		// validar fechas..
		/*
		 * String fechaIni = URLDecoder.decode(formBean.getFechaIni(),
		 * "ISO-8859-1"); String fechaFin =
		 * URLDecoder.decode(formBean.getFechaFin(), "ISO-8859-1");
		 */
		if (!formBean.getFechaIni().equals("")
				&& !formBean.getFechaFin().equals("")) {
			if (!Utility.isDateValid(formBean.getFechaIni())) {
				request.setAttribute("errorfecha",
						"La fecha inicial es incorrecta");
				continuar = false;
			} else if (!Utility.isDateValid(formBean.getFechaFin())) {
				request.setAttribute("errorfecha",
						"La fecha final es incorrecta");
				continuar = false;
			} else {
				Date fIni = new Date(formBean.getFechaIni());
				Date fFin = new Date(formBean.getFechaFin());
				if (fIni.after(fFin)) {
					request.setAttribute("errorfecha",
							"La fecha inicial es mayor a la final");
					continuar = false;
				}
			}
		}

		if (continuar) {
			session.removeAttribute("beneficiosSede");
			if (formBean.getOperacion().equals(Utility.OP_GENERAR_REPORTE)) {
				Collection<ReporteTotalBeneficiosOtorVO> cobeneficio = null;
				try {

					RepDetBeneficiarioVO objDetBeneVO = new RepDetBeneficiarioVO();
					if (formBean.getCodeSede() != null
							&& !formBean.getCodeSede().equals("")) {
						objDetBeneVO.setCodeSede(new Long(formBean
								.getCodeSede()));
					}
					if (formBean.getCodeArea() != null
							&& !formBean.getCodeArea().equals("")) {
						objDetBeneVO.setCodeArea(new Long(formBean
								.getCodeArea()));
					}
					if (formBean.getCodePrograma() != null
							&& !formBean.getCodePrograma().equals("")) {
						objDetBeneVO.setCodePrograma(new Long(formBean
								.getCodePrograma()));
					}
					if (formBean.getCodeSubprograma() != null
							&& !formBean.getCodeSubprograma().equals("")) {
						objDetBeneVO.setCodeSubprograma(new Long(formBean
								.getCodeSubprograma()));

						String codigovfl = request.getParameter("codigovfl");

						if (formBean.getCodeVfl() != null) {
							AtributoVO atributoVO = atributosServiceImpl2
									.findAtributoByCodigo(new Long(formBean
											.getCodeSubprograma()));

							if (atributoVO != null) {
								session.setAttribute("Gestor",
										atributoVO.getValoresflexibles());
								if (!formBean.getCodeVfl().equals("")) {
									request.setAttribute("codigovfl", codigovfl);
									request.setAttribute("codigoAtrGestor",
											atributoVO.getCodigo());
									objDetBeneVO.setGestor(formBean
											.getCodeVfl());
									objDetBeneVO.setCodigoAtrGestor(atributoVO
											.getCodigo());
								}

							} else {
								request.removeAttribute("Gestor");
								request.removeAttribute("codigovfl");
								request.removeAttribute("codigoAtrGestor");
							}
						}
					}
					if (!formBean.getFechaIni().equals("")) {
						objDetBeneVO.setDesde(formBean.getFechaIni());
					}
					if (!formBean.getFechaFin().equals("")) {
						objDetBeneVO.setHasta(formBean.getFechaFin());
					}
					session.setAttribute("Parametros", objDetBeneVO);

					objDetBeneVO = reporteTotalBeneficiosOtorServiceImpl
							.findFilters(objDetBeneVO);
					cobeneficio = reporteTotalBeneficiosOtorServiceImpl
							.findBeneficiosOtorgado(objDetBeneVO,
									formBean.getFiltros());

					if (cobeneficio != null && !cobeneficio.isEmpty()) {
						formBean.setBeneficios(cobeneficio);
						request.setAttribute("beneficiosReporteTotalBOT",
								cobeneficio);
						session.setAttribute("beneficiosReporteTotalBOT",
								cobeneficio);
						session.setAttribute("criteriaReporteTotalBOT",
								objDetBeneVO);
					}
					objDetBeneVO = null;
				} catch (DAOException e) {
					SUBException.logDebugError("", e);
				}
			}
		}

		if (formBean.getOperacion().equals(Utility.OP_GENERAR_REPORTE)) {
			return mapping.findForward("ir");
		} else {
			return mapping.findForward("success");
		}

	}
}